package work.base.jvm.reference;

import java.lang.ref.WeakReference;

/**
 * 弱引用
 */
public class WeakReferenceTest {
    public static void main(String[] args) {
        /**
         * 弱引用 只要垃圾回收看到了 就会回收
         * 和强引用的区别 强引用是引用不存在了之后 回收对象 （引用的连接断了之后）
         * 弱引用是引用还存在的情况下回收了对象 (WeakReference和实体对象的之间的引用连接还存在的情况下）
         */
        WeakReference<ReferenceEntity> m = new WeakReference<>(new ReferenceEntity());
        System.out.println(m.get());
        System.gc();
        System.out.println(m.get());

        /**
         * Thread 类有个变量threadLocals 也就是ThreadLocalMap key是ThreadLocal对象 value是set的参数
         * set方法实际是存入到ThreadLocalMap,  ThreadLocalMap的内部类Entry是继承了WeakReference类
         * 使用弱引用的原因: 防止内存泄露
         */
        ThreadLocal<String> threadLocal = new ThreadLocal<>();
        threadLocal.set("AAA");
        // 必须remove 否则会造成内存泄露
        threadLocal.remove();

    }


}
